package com.auntvt.timo.jpax.core.quick.interfaces;

import java.io.Serializable;
import java.util.Collection;

/**
 * 基本查询条件接口
 *
 * @author 小懒虫 <auntvt@163.com>
 * @date 2021/7/31
 */
public interface QuickCriteria<Children, R> extends Serializable {

    /**
     * 等于
     * <p>sql：a = ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children eq(boolean condition, R fieldName, Object value);

    /**
     * 等于
     * <p>sql：a = ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children eq(R fieldName, Object value) {
        return eq(true, fieldName, value);
    }

    /**
     * 不等于
     * <p>sql：a = ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children ne(boolean condition, R fieldName, Object value);

    /**
     * 不等于
     * <p>sql：a = ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children ne(R fieldName, Object value) {
        return ne(true, fieldName, value);
    }

    /**
     * 大于
     * <p>sql：a > ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children gt(boolean condition, R fieldName, Object value);

    /**
     * 大于
     * <p>sql：a > ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children gt(R fieldName, Object value) {
        return gt(true, fieldName, value);
    }

    /**
     * 大于等于
     * <p>sql：a >= ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children ge(boolean condition, R fieldName, Object value);

    /**
     * 大于等于
     * <p>sql：a >= ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children ge(R fieldName, Object value) {
        return ge(true, fieldName, value);
    }

    /**
     * 小于
     * <p>sql：a < ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children lt(boolean condition, R fieldName, Object value);

    /**
     * 小于
     * <p>sql：a < ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children lt(R fieldName, Object value) {
        return lt(true, fieldName, value);
    }

    /**
     * 小于等于
     * <p>sql：a <= ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children le(boolean condition, R fieldName, Object value);

    /**
     * 小于等于
     * <p>sql：a <= ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children le(R fieldName, Object value) {
        return le(true, fieldName, value);
    }

    /**
     * 模糊查询
     * <p>sql：a like ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children like(boolean condition, R fieldName, String value);

    /**
     * 模糊查询
     * <p>sql：a like ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children like(R fieldName, String value) {
        return like(true, fieldName, value);
    }

    /**
     * 模糊查询-两边
     * <p>sql：a like %?%</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children likeBoth(boolean condition, R fieldName, String value);

    /**
     * 模糊查询-两边查询
     * <p>sql：a like %?%</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children likeBoth(R fieldName, String value) {
        return likeBoth(true, fieldName, value);
    }

    /**
     * 模糊查询-左查询
     * <p>sql：a like %?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children likeLeft(boolean condition, R fieldName, String value);

    /**
     * 模糊查询-左查询
     * <p>sql：a like %?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children likeLeft(R fieldName, String value) {
        return likeLeft(true, fieldName, value);
    }

    /**
     * 模糊查询-右查询
     * <p>sql：a like ?%</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children likeRight(boolean condition, R fieldName, String value);

    /**
     * 模糊查询-左查询
     * <p>sql：a like %?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children likeRight(R fieldName, String value) {
        return likeRight(true, fieldName, value);
    }

    /**
     * 非，模糊查询
     * <p>sql：a not like ?</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    Children notLike(boolean condition, R fieldName, String value);

    /**
     * 非，模糊查询
     * <p>sql：a not like ?</p>
     *
     * @param fieldName 字段名
     * @param value     值
     * @return this
     */
    default Children notLike(R fieldName, String value) {
        return notLike(true, fieldName, value);
    }

    /**
     * 区间查询
     * <p>sql：a between ?1 and ?2</p>
     *
     * @param condition  条件表达式
     * @param fieldName  字段名
     * @param leftValue  左边界值
     * @param rightValue 右边界值
     * @return this
     */
    Children between(boolean condition, R fieldName, Object leftValue, Object rightValue);

    /**
     * 区间查询
     * <p>sql：a between ?1 and ?2</p>
     *
     * @param fieldName  字段名
     * @param leftValue  左边界值
     * @param rightValue 右边界值
     * @return this
     */
    default Children between(R fieldName, Object leftValue, Object rightValue) {
        return between(true, fieldName, leftValue, rightValue);
    }

    /**
     * 非，区间查询
     * <p>sql：a not between ?1 and ?2</p>
     *
     * @param condition  条件表达式
     * @param fieldName  字段名
     * @param leftValue  左边界值
     * @param rightValue 右边界值
     * @return this
     */
    Children notBetween(boolean condition, R fieldName, Object leftValue, Object rightValue);

    /**
     * 非，区间查询
     * <p>sql：a not between ?1 and ?2</p>
     *
     * @param fieldName  字段名
     * @param leftValue  左边界值
     * @param rightValue 右边界值
     * @return this
     */
    default Children notBetween(R fieldName, Object leftValue, Object rightValue) {
        return notBetween(true, fieldName, leftValue, rightValue);
    }

    /**
     * 字段为空
     * <p>sql：a is null</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @return this
     */
    Children isNull(boolean condition, R fieldName);

    /**
     * 字段为空
     * <p>sql：a is null</p>
     *
     * @param fieldName 字段名
     * @return this
     */
    default Children isNull(R fieldName) {
        return isNull(true, fieldName);
    }

    /**
     * 字段不为空
     * <p>sql：a is not null</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @return this
     */
    Children isNotNull(boolean condition, R fieldName);

    /**
     * 字段不为空
     * <p>sql：a is not null</p>
     *
     * @param fieldName 字段名
     * @return this
     */
    default Children isNotNull(R fieldName) {
        return isNotNull(true, fieldName);
    }

    /**
     * in 包含的值
     * <p>sql：a in (...)</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    Children in(boolean condition, R fieldName, Object... values);

    /**
     * in 包含的值
     * <p>sql：a in (...)</p>
     *
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    default Children in(R fieldName, Object... values) {
        return in(true, fieldName, values);
    }

    /**
     * in 包含的值
     * <p>sql：a in (...)</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    default Children in(boolean condition, R fieldName, Collection<?> values) {
        return in(condition, fieldName, values.toArray());
    }

    /**
     * in 包含的值
     * <p>sql：a in (...)</p>
     *
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    default Children in(R fieldName, Collection<?> values) {
        return in(true, fieldName, values);
    }

    /**
     * not in 不包含的值
     * <p>sql：a not in (...)</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    Children notIn(boolean condition, R fieldName, Object... values);

    /**
     * not in 不包含的值
     * <p>sql：a not in (...)</p>
     *
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    default Children notIn(R fieldName, Object... values) {
        return notIn(true, fieldName, values);
    }

    /**
     * not in 不包含的值
     * <p>sql：a not in (...)</p>
     *
     * @param condition 条件表达式
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    default Children notIn(boolean condition, R fieldName, Collection<?> values) {
        return notIn(condition, fieldName, values.toArray());
    }

    /**
     * not in 不包含的值
     * <p>sql：a not in (...)</p>
     *
     * @param fieldName 字段名
     * @param values    数组值
     * @return this
     */
    default Children notIn(R fieldName, Collection<?> values) {
        return notIn(true, fieldName, values);
    }


}
